import {ElMessage, genFileId} from "element-plus";
import type {IFileInfo, IUploadFile} from "@/components/base-upload/types.ts";
import minioApi from "@/api/modules/minio";
import {to} from "sf-utils2";

/**
 * 将 prop 文件列表转换为上传文件列表
 * @param fileList - 文件列表，包含 IUploadFile 或 IFileInfo 类型
 * @param callback - 回调函数，用于处理转换后的文件列表
 * @returns 转换后的上传文件列表
 */
export function convertPropFileList(fileList: Array<IUploadFile | IFileInfo>, callback: (index: number, file: IFileInfo) => void): Array<IUploadFile> {
  if (!fileList) return [];

  const uploadList = []

  fileList.forEach((file, index) => {
    // 如果文件已有状态字段，说明是上传文件，直接返回
    if ('status' in file) {
      return uploadList.push(file)
    }
    // 否则将 IFileInfo 转换为 IUploadFile，默认处理后端返回的文件
    const uploadFile = convertFileInfoToUploadFile(file)
    uploadList.push(uploadFile);

    // 如果不是一个有效的 URL，那么刷新 URL
    if (!isEffectiveURL(file))
      refreshURL(file).then((newFile) => {
        callback(index, newFile)
      })
  })

  return uploadList
}

/**
 * 将文件信息对象转换为上传文件对象
 * @param file - 文件信息对象 (IFileInfo)
 * @returns 上传文件对象 (IUploadFile)
 */
export function convertFileInfoToUploadFile(file: IFileInfo): IUploadFile {
  return {
    name: file.fileName, // 文件名
    url: file.previewUrl, // 文件预览路径
    status: 'success', // 设置默认状态为成功
    percentage: 100, // 文件已完成上传
    size: file.fileSize, // 文件大小
    file: file, // 原始文件信息
    response: {code: 200, data: file, message: '上传成功'}, // 响应信息
    uid: genFileId(), // 生成唯一文件 ID
  };
}


/**
 * 检查 url 是否在有效时间内
 * @param file
 * @returns 是否在有效时间内 true: 有效 false: 无效
 */
export function isEffectiveURL(file: IFileInfo): boolean {
  file
  // todo 不再进行判断，每次都请求
  return false
  // const queryParams = new URL(file.previewUrl).searchParams;
  //
  // // 如果文件没有url params， 那么直接返回true
  // if (queryParams.size === 0) return true
  //
  // const dateTime = queryParams.get('X-Amz-Date');
  // const expires = queryParams.get('X-Amz-Expires');
  //
  // // 将日期字符串插入合适的分隔符
  // const isoFormattedString = dateTime.replace(
  //   /(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})Z/,
  //   '$1-$2-$3T$4:$5:$6Z'
  // );
  //
  // const generateTIme = dayjs(isoFormattedString)
  //
  // // 判断是否在有效期内, 5秒兼容时间差
  // return !dayjs(generateTIme).add(Number(expires) - 5, 's').isBefore(dayjs());
}

/**
 * 刷新文件地址，当文件地址超时
 * @param file - 文件信息对象 (IFileInfo)
 * @returns 更新后的文件信息对象
 */
export async function refreshURL(file: IFileInfo): Promise<IFileInfo> {
  const [response, error] = await to(minioApi.shareFile({
    bucketName: file.bucketName,
    filePath: file.filePath,
  }));
  const {code, message, data} = response ?? {};

  if (error || code !== 200) {
    ElMessage.error(message || '获取文件地址失败，请稍后重试');
    return file;
  }

  // 返回更新后的文件对象，更新 previewUrl
  return {...file, previewUrl: data};
}
